package com.mac.web;

import com.mac.util.CheckCodeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 验证码Servlet类，用于生成和验证验证码。
 */
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {

    // 使用SLF4J记录日志
    private static final Logger LOGGER = LoggerFactory.getLogger("CheckCodeServlet.Class");

    /**
     * 处理GET请求，生成验证码图片。
     * @param request 请求对象，包含请求信息。
     * @param response 响应对象，用于返回响应数据。
     * @throws ServletException 如果发生Servlet异常。
     * @throws IOException 如果发生I/O异常。
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 首先获取会话
        HttpSession session = request.getSession(true);

        final String captcha;
        ServletOutputStream outputStream = null;
        try {
            // 设置响应类型为图片
            response.setContentType("image/jpeg");

            // 生成验证码并写入输出流
            outputStream = response.getOutputStream();
            captcha = CheckCodeUtil.outputVerifyImage(100, 50, outputStream, 4);
            LOGGER.info("CheckCodeUtil.outputVerifyImage -> succeed");
        } catch (IOException e) {
            LOGGER.error("CheckCodeUtil.outputVerifyImage -> failed", e);
            throw new RuntimeException(e);
        } finally {
            // 关闭输出流
            if (outputStream != null) {
                outputStream.close();
            }
        }

        // 将验证码存入Session中，以便后续验证
        session.setAttribute("captcha", captcha);
    }

    /**
     * 处理POST请求，对于验证码Servlet，POST请求与GET请求处理相同。
     * @param request 请求对象，包含请求信息。
     * @param response 响应对象，用于返回响应数据。
     * @throws ServletException 如果发生Servlet异常。
     * @throws IOException 如果发生I/O异常。
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}